/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mundo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author cesarfgt
 */
public class Cruce implements Serializable{
    private Punto InfIz;
    private Punto SupDer;
    private ArrayList<Tramo> ListaTramos;
    private int Semaforos=0;
    private List<Punto> Puntos=new ArrayList();

    @Override
    public String toString() {
        String t="[";
        for(Punto p: Puntos){
            t=t+p.toString();
        }
        t=t+"]";
        return "InfIz:"+InfIz+"SupDer:"+SupDer+t; 
    }
    
    private Tramo Activo=null;

    public Cruce(Punto infIz, Punto supDer) {
        this.InfIz = infIz;
        this.SupDer = supDer;
        this.ListaTramos = new ArrayList();
        Puntos.add(new Punto(InfIz.getX(),InfIz.getY()));
        Puntos.add(new Punto(SupDer.getX(),InfIz.getY()));
        Puntos.add(new Punto(SupDer.getX(),SupDer.getY()));
        Puntos.add(new Punto(InfIz.getX(),SupDer.getY()));
    }
    
    
    
    public boolean equals(Cruce c){
        if((c.InfIz.equals(this.InfIz))&&(c.SupDer.equals(this.SupDer))){
            return true;
        }
        return false;
    }
    
    public void addTramo(Tramo tramo){
        ListaTramos.add(tramo);
    }
    public boolean removeTramo(Tramo tramo){
        return ListaTramos.remove(tramo);
    }

    /**
     * @return the InfIz
     */
    public Punto getInfIz() {
        return InfIz;
    }

    /**
     * @return the SupDer
     */
    public Punto getSupDer() {
        return SupDer;
    }

    public void setTramoActivo(Tramo Activo){
        this.Activo=Activo;
    }

    public Tramo getTramoActivo(){
        return Activo;
    }

    public int getSemaforos(){
        return Semaforos;
    }
    
    public void addSemaforos(){
        Semaforos+=1;
    }
    
    public List<Punto> getPuntos(){
        return this.Puntos;
    }
    
    public boolean inCruce(Punto ubicacion){
        //int i=Integer.MAX_VALUE;
       
       for(Punto p:this.Puntos){
           if(ubicacion.equals(p)){
               return true;
           }
       }
       
       return false;
    }
    
    public double Distancia(Punto ubicacion){
        return (Math.hypot(getInfIz().getX()-ubicacion.getX(), getInfIz().getY()-ubicacion.getY())+Math.hypot(getSupDer().getX()-ubicacion.getX(), getSupDer().getY()-ubicacion.getY()))/2;
    }
}
